package so.obligatorio;

import java.util.ArrayList;
import java.util.List;

import so.obligatorio.modelo.Escenario;
import so.obligatorio.procesos.PDV;
import so.obligatorio.procesos.PDVCentral;
import so.obligatorio.procesos.PDVEspectaculo;
import so.obligatorio.procesos.PDVOrganizacion;
import so.obligatorio.procesos.PDVRedCobranza;
import so.obligatorio.procesos.PDVWeb;

/**
 * Representa la simulacion en ejecucion.
 */
public class Simulacion {

	private List<PDVOrganizacion> pdvsOrganizacion;
	private List<PDVEspectaculo> pdvsEspectaculo;
	private List<PDVRedCobranza> pdvsRedCobranza;
	private List<PDVWeb> pdvsWeb;

	
	/**
	 * Constructor de la clase.
	 * @param escenario
	 */
	public Simulacion(Escenario escenario) {
		prepararPDVs(escenario.getCantHilosOrganizacion(),
				escenario.getCantBoleteriasEspectaculo(),
				escenario.getCantBoleteriasRedCobranza(), 
				escenario.getCantBoleteriasWeb());

		ManejadorColas.getInstance().setColaEntrada(escenario.getClientes());
		ManejadorColas.getInstance().procesarClientes(10);


		Thread reloj = new Thread(Reloj.getInstance());
		reloj.setName("Reloj!!");
		PDVCentral.getInstance().setEspectaculo(escenario.getEspectaculo());
		reloj.start();
		iniciarPDVs();
	}

	/**
	 * Metodo que inicia la listas de PDVS.
	 */
	private void iniciarPDVs() {
		List<PDV> pdvs = new ArrayList<PDV>();
		pdvs.addAll(pdvsEspectaculo);
		pdvs.addAll(pdvsRedCobranza);
		pdvs.addAll(pdvsWeb);
		pdvs.addAll(pdvsOrganizacion);

		for(PDV pdv : pdvs) {
			pdv.start();
		}
		
	}

	/**
	 * Crea los PDVs apartir de las cantidades provistas.
	 * @param cantBoleteriasEspectaculo
	 * @param cantBoleteriasRedCobranza
	 * @param cantBoleteriasWeb
	 */
	private void prepararPDVs(int hilosOrganizacion, int cantBoleteriasEspectaculo, int cantBoleteriasRedCobranza, int cantBoleteriasWeb) {

		this.pdvsOrganizacion = new ArrayList<PDVOrganizacion>();
		for(int i = 0; i < hilosOrganizacion; i++) {
			PDVOrganizacion pdv = new PDVOrganizacion();
			pdv.setName("PDVOrganizacion " + i);
			this.pdvsOrganizacion.add(pdv);
		}

		 

		this.pdvsEspectaculo = new ArrayList<PDVEspectaculo>();
		for(int i = 0; i < cantBoleteriasEspectaculo; i++) {
			PDVEspectaculo pdv = new PDVEspectaculo();
			pdv.setName("PDVEspectaculo " + i);
			pdvsEspectaculo.add(pdv);
		}

		this.pdvsRedCobranza = new ArrayList<PDVRedCobranza>();
		for(int i = 0; i < cantBoleteriasRedCobranza; i++) {
			PDVRedCobranza pdv = new PDVRedCobranza();
			pdv.setName("PDVRedCobranza " + i);
			pdvsRedCobranza.add(pdv);
		}

		this.pdvsWeb = new ArrayList<PDVWeb>();
		for(int i = 0; i < cantBoleteriasWeb; i++) {
			PDVWeb pdv = new PDVWeb();
			pdv.setName("PDVWeb " + i);
			pdvsWeb.add(pdv);
		}
	}
}
